@file:Suppress("unused")

package com.sscl.baselibrary.utils

import com.google.gson.Gson
import com.google.gson.GsonBuilder
import com.google.gson.JsonSyntaxException
import com.google.gson.stream.JsonReader
import org.json.JSONException
import org.json.JSONObject
import java.lang.reflect.Type

/**
 * @author jackie
 * @date 2024/01/29
 */
object GsonUtils {

    private var GSON: Gson = GsonBuilder()
        .serializeNulls()
        .create()

    /**
     * 把对象转换为Json数据
     *
     * @param obj 对象
     * @return json字符串
     */
    fun toJson(obj: Any?): String {
        return GSON.toJson(obj)
    }

    /**
     * 把JSON数据转换为对象
     *
     * @param str  JSON数据
     * @param type 对象
     * @param <T>  泛型
     * @return 对象
     */
    fun <T> fromJson(str: String, type: Class<T>): T {
        return GSON.fromJson(str, type)
    }

    /**
     * 把JSON数据转换为对象
     *
     * @param json    json数据
     * @param typeOfT 类型
     * @param <T>     泛型
     * @return 对象
     */
    fun <T> fromJson(json: String, typeOfT: Type): T {
        return GSON.fromJson(json, typeOfT)
    }

    /**
     * JSON字符串转Map
     *
     * @param jsonString json字符串
     * @return MAP集合
     */
    fun <T, K> fromJsonMap(jsonString: String): Map<T, K>? {
        if (jsonString.isEmpty()) {
            return null
        }
        var t: Map<T, K>? = null
        try {
            t = GSON.fromJson<Map<T, K>>(jsonString, MutableMap::class.java)
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return t
    }

    /**
     * json数据转对象
     *
     * @param jsonReader json数据
     * @param type       type
     * @param <T>        泛型
     * @return 对象
     */
    fun <T> fromJson(jsonReader: JsonReader, type: Type): T {
        return GSON.fromJson(jsonReader, type)
    }

    /**
     * 判断字符串是否为json
     *
     * @param stringData 字符串数据
     * @return 是否为json
     */
    fun isJson(stringData: String): Boolean {
        try {
            GSON.fromJson(stringData, Any::class.java)
        } catch (e: JsonSyntaxException) {
            return false
        }
        try {
            JSONObject(stringData)
        } catch (e: JSONException) {
            return false
        }
        return true
    }

}